#ifndef __TDA_DNS_H__
#define __TDA_DNS_H__

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>

#include "TDAPila.h"
#include "TDA_AB.h"

#define MAX_IP_LENGTH 16
#define DEFAULT_DNS "200.49.130.20" /* OpenDNS Prim. Server */


typedef struct TDA_DNS
{
    char ipAddress[MAX_IP_LENGTH];
    TPila pilaLog;
    TAB *ab;
    int qtyEventos;

} TDA_DNS;

typedef struct {

    char dominio[100];
    time_t fechaHora;

} TDADNSLog;


/* Descripcion: Crea una instancia de TDA DNS.
 *
 * Precondiciones: dns tiene sizeof(TDADNS) bytes reservados. dns no creado.
 * tamDato es el tama~no del tipo de dato T que tendran los elementos que se van
 * a guardar asociados a un dominio.
 *
 * Postcondiciones: Se inicializo la estructura apuntada por dns.
 */
int crearDNS (TDA_DNS* DNS);


/* Descripcion: Destruye una instancia de TDA DNS.
 *
 * Precondiciones: dns creado y vacio.
 *
 * Postcondiciones: Se destruyo la instancia dns.
 */
void destruirDNS (TDA_DNS* DNS);


/* Descripcion: Devuelve TRUE si dominio existe en dns. En cualquier otro caso
 * devuelve FALSE.
 *
 * Precondiciones: dns creado. dominio es un nombre de dominio valido.
 *
 * Postcondiciones: No realiza modificaciones.
 */
int existeDominio (TDA_DNS DNS, char* dominio);


/* Descripcion: Agrega un dominio con un dato asociado.
 *
 * Precondiciones: dns creado. dominio es un nombre de dominio valido y no
 * existente en dns. dato apunta a una variable de tipo T.
 *
 * Postcondiciones: Se agrego el domino dominio, y se asocio el valor dato.
 */
int agregarDominio (TDA_DNS* DNS, char* dominio);


/* Descripcion: Obtiene el valor asociado a un dominio.
 *
 * Precondiciones: dns creado. dominio es un nombre de dominio valido existente en
 * dns. dato apunta a una variable de tipo T.
 *
 * Postcondiciones: Se copio a dato el valor asociado al dominio dominio.
 */
void* obtenerValor(TDA_DNS *DNS, char* dominio, void* server);

void* queryDNS(TDA_DNS *DNS, char* dominio, void* server);

/* Descripcion: Elimina un dominio.
 * Precondiciones: dns creado. dominio es un nombre de dominio valido y existente
 * en dns.
 *
 * Postcondiciones: Se elimino dominio, y su valor asociado, de dns
 */
void eliminarDominio(TDA_DNS *DNS, char* dominio);


/* Descripcion: Escribe en archivo un registro de todas las consultas realizadas.
 *
 * Precondiciones: dns creado y archivo abierto con permisos de escritura.
 *
 * Postcondiciones: Se escribio en el archivo una lInea por cada consulta realizada.
 */
int escribirLogDNS(TDA_DNS DNS, FILE* archivo);





#endif
